<

flutterパフォーマンスプロファイリング

こう言われています。速いアプリは素晴らしいです、 しかし、スムーズアプリはさらに優れています。」 アプリがスムーズにレンダリングされない場合は、 どうやって直すのですか?どこから始めますか? このガイドでは、どこから始めればよいかを示します。 実行すべき手順と役立つツール。

パフォーマンスの問題の診断

パフォーマンスの問題があるアプリを診断するには、次の機能を有効にします パフォーマンス オーバーレイで UI とラスター スレッドを確認します。 (ラスター スレッドは、以前は GPU スレッドとして知られていました。) 始める前に、実行していることを確認してください。プロファイルモード、エミュレータを使用していないこと。 最良の結果を得るには、最も遅いデバイスを選択するとよいでしょう。 ユーザーが使用する可能性があります。

物理デバイスに接続する

Flutter アプリケーションのほぼすべてのパフォーマンス デバッグ 物理的な Android または iOS デバイスで実行する必要があります。 Flutter アプリケーションが実行されている状態でプロファイルモード。 デバッグ モードの使用、またはシミュレーターでアプリを実行する またはエミュレータは、通常、最終的なものを示すものではありません。 リリースモードビルドの動作。パフォーマンスの確認を検討する必要があります ユーザーが合理的に使用する可能性がある最も遅いデバイス上で。

プロファイルモードで実行する

Flutter のプロファイル モードはアプリケーションをコンパイルして起動します リリースモードとほぼ同じですが、十分な追加機能が追加されています パフォーマンスの問題をデバッグできる機能。 たとえば、プロファイル モードは、トレース情報を プロファイリングツール。

次のようにプロファイル モードでアプリを起動します。

  • VS Code で、launch.jsonファイルを作成し、flutterMode財産をprofile(プロファイリングが完了したら、元に戻します)releaseまたdebug):

    "configurations": [
      {
        "name": "Flutter",
        "request": "launch",
        "type": "dart",
        "flutterMode": "profile"
      }
    ]
    
  • Android Studio と IntelliJ では、実行 > Flutter main.dart をプロファイル モードで実行するメニュー項目。
  • コマンドラインから、--profile国旗:

    $ flutter run --profile
    

さまざまなモードの詳細については、 見るFlutterのビルドモード

まず、DevTools を開いて表示します。 パフォーマンス オーバーレイについては、次のセクションで説明します。

開発ツールを起動する

DevTools は、プロファイリング、ヒープの検査、 コードカバレッジの表示、パフォーマンスオーバーレイの有効化、 ステップバイステップのデバッガ。 開発ツール」タイムラインビューを調査することができます フレームごとのアプリケーションの UI パフォーマンス。

アプリがプロファイル モードで実行されると、開発ツールを起動する

パフォーマンスオーバーレイ

パフォーマンス オーバーレイには、統計が 2 つのグラフで表示されます アプリのどこに時間が費やされているかを示します。 UI の場合 がジャンク (フレームをスキップ) している場合、これらのグラフはその理由を理解するのに役立ちます。 グラフは実行中のアプリの上に表示されますが、そうではありません 通常のウィジェットのように描画される - Flutter エンジン自体 オーバーレイをペイントしますが、パフォーマンスへの影響は最小限に抑えられます。 各グラフは、そのスレッドの最後の 300 フレームを表します。

このセクションでは、パフォーマンス オーバーレイを有効にする方法について説明します。 これを使用して、アプリケーションのジャンクの原因を診断します。 次のスクリーンショットは、実行中のパフォーマンス オーバーレイを示しています。 Flutter Gallery の例:

Screenshot of overlay showing zero jank
ラスター スレッドを示すパフォーマンス オーバーレイ (上)、 および UI スレッド (下)。
緑色の縦棒 現在のフレームを表します。

グラフの解釈

上のグラフ (「GPU」とマーク) は、 ラスター スレッド、一番下のグラフは時間を示します UI スレッドによって消費されます。 グラフ全体の白い線は 16 ミリ秒の増分を示しています 縦軸に沿って。グラフが 1 を超えた場合 これらの行のうち、60Hz 未満で実行していることになります。 横軸はフレームを表します。グラフは アプリケーションがペイントするときにのみ更新されます。 したがって、アイドル状態の場合、グラフは動きを停止します。

オーバーレイは常に次の場所で表示されます。プロファイルモード、 以来デバッグモードパフォーマンスが意図的に犠牲にされている 支援を目的とした高価なアサートと引き換えに したがって、結果は誤解を招くものになります。

各フレームは 1/60 以内に作成して表示する必要があります。 1 秒 (約 16 ミリ秒)。この制限を超えるフレーム (どちらのグラフでも) 表示に失敗し、ジャンクが発生します。 グラフの一方または両方に赤い垂直バーが表示されます。 UI グラフに赤いバーが表示される場合は、Dart コードが過大です 高い。 GPUグラフに赤い縦棒が表示されている場合は、 シーンが複雑すぎてすぐにレンダリングできません。

Screenshot of performance overlay showing jank with red bars
赤い垂直バーは、現在のフレームが レンダリングとペイントの両方にコストがかかります。
両方のグラフの場合 赤く表示されたら、UI スレッドの診断から始めます。

flutterのスレッド

Flutter はその作業を行うために複数のスレッドを使用しますが、 オーバーレイにはスレッドのうち 2 つだけが表示されます。 Dart コードはすべて UI スレッド上で実行されます。 他のスレッドに直接アクセスすることはできませんが、 UI スレッドでのアクションはパフォーマンスに影響を与えます 他のスレッドでも。

プラットフォームスレッド

プラットフォームのメインスレッド。プラグインコードはここで実行されます。 詳細については、「UIキットiOS のドキュメント、 またはメインスレッドAndroid のドキュメント。 このスレッドはパフォーマンス オーバーレイには表示されません。

UIスレッド

UI スレッドは Dart VM で Dart コードを実行します。 このスレッドには、あなたが書いたコードと、によって実行されたコードが含まれています。 アプリに代わって Flutter のフレームワーク。 アプリがシーンを作成して表示するとき、UI スレッドは あるレイヤーツリー、デバイスに依存しない軽量オブジェクト ペイント コマンドを実行し、レイヤー ツリーをラスター スレッドに送信して、 デバイス上でレンダリングされます。このスレッドをブロックしないでください!パフォーマンス オーバーレイの一番下の行に表示されます。

ラスタースレッド(以前は GPU スレッドとして知られていました)

ラスター スレッドはレイヤー ツリーを取得して表示します。 GPU (グラフィック プロセッシング ユニット) と通信することで実現します。 ラスター スレッドやそのデータに直接アクセスすることはできませんが、 このスレッドが遅い場合、それはあなたが何かをした結果です ダーツコードに。 Skia と Impeller のグラフィックス ライブラリ、 このスレッドで実行します。 パフォーマンス オーバーレイの一番上の行に表示されます。 このスレッドは、以前は「GPU スレッド」として知られていました。 GPU 用にラスタライズします。しかし、それは実行されていますCPU。 多くの開発者が誤って名前を「ラスタースレッド」に変更しました。 (でも当然のことですが) スレッドが GPU ユニット上で実行されると仮定します。

I/Oスレッド

負荷の高いタスク (主に I/O) を実行します。 それ以外の場合は、UI またはラスター スレッドのいずれかがブロックされます。 このスレッドはパフォーマンス オーバーレイには表示されません。

詳細情報やビデオへのリンクについては、 見るフレームワークのアーキテクチャでGitHub ウィキ、コミュニティ記事、レイヤーケーキ。

パフォーマンスオーバーレイの表示

次のようにパフォーマンス オーバーレイの表示を切り替えることができます。

  • flutterインスペクタの使用
  • コマンドラインから
  • プログラム的に

flutterインスペクタの使用

PerformanceOverlay ウィジェットを有効にする最も簡単な方法は次のとおりです。 Flutter インスペクターから入手できます。インスペクタービュー開発ツール。をクリックするだけですパフォーマンスオーバーレイオーバーレイを切り替えるボタン 実行中のアプリで。

コマンドラインから

を使用してパフォーマンス オーバーレイを切り替えます。Pからのキー コマンドライン。

プログラム的に

オーバーレイをプログラムで有効にするには、次を参照してください。パフォーマンスオーバーレイのセクションFlutter アプリをプログラムでデバッグするページ。

UI グラフの問題の特定

UI グラフでパフォーマンス オーバーレイが赤で表示されている場合は、 GPU グラフであっても、Dart VM のプロファイリングから始めます。 赤も表示されます。

GPU グラフの問題の特定

シーンによっては、簡単に構築できるレイヤー ツリーが生成される場合があります。 ただし、ラスター スレッドでレンダリングするにはコストがかかります。これが起こるとき、 UI グラフには赤が表示されませんが、GPU グラフには赤が表示されます。 この場合、コードが何をしているのかを理解する必要があります それがコードのレンダリングを遅くする原因となっています。特定の種類のワークロード GPUにとってはより困難です。不要な電話がかかる可能性がある にsaveLayer、複数のオブジェクトと交差する不透明度、 特定の状況でのクリップまたはシャドウ。

遅さの原因がアニメーション中にあると思われる場合は、 クリックスローアニメーションFlutter インスペクタのボタン アニメーションを 5 倍遅くします。 速度をさらに制御したい場合は、これを行うこともできますプログラム的に

遅いのは最初のフレームですか、それともアニメーション全体ですか? アニメーション全体の場合、クリッピングが速度低下の原因となっていますか? もしかしたら、そうではないシーンを描く別の方法があるかもしれません クリッピングを使用します。たとえば、不透明なコーナーを正方形にオーバーレイします。 角丸長方形に切り取る代わりに。 フェード、回転などの静止シーンの場合 操作された、RepaintBoundary役立つかもしれません。

オフスクリーンレイヤーのチェック

saveLayerこの方法は、最も高価な方法の 1 つです。 Flutter フレームワーク。後処理を適用するときに便利です ただし、アプリの速度が低下する可能性があるため、次の場合は避けてください。 それは必要ありません。電話しなくてもsaveLayer明示的に、 あなたに代わって暗黙的な呼び出しが行われる可能性があります。かどうかを確認できます あなたのシーンが使用しているsaveLayerとともにPerformanceOverlayLayer.checkerboardOffscreenLayersスイッチ。

スイッチが有効になったら、アプリを実行して画像を探します 点滅するボックスで囲まれています。ボックスがちらつきます 新しいフレームがレンダリングされている場合、フレームからフレームへ。例えば、 おそらく、レンダリングされた不透明度を持つオブジェクトのグループがあるでしょう。 使用してsaveLayer。この場合、おそらく次の方がパフォーマンスが高くなります。 親ではなく個々のウィジェットに不透明度を適用します ウィジェット ツリーの上位にあるウィジェット。同じことが当てはまります クリッピングやシャドウなど、コストがかかる可能性のあるその他の操作。

への電話に遭遇したときsaveLayer、 次の質問を自分自身に問いかけてください。

  • アプリにはこのエフェクトが必要ですか?
  • これらの呼び出しを削除することはできますか?
  • 同じ効果をグループではなく個々の要素に適用できますか?

キャッシュされていない画像の確認

画像をキャッシュするRepaintBoundaryいいね、意味があるとき

最もコストのかかる操作の 1 つである、 リソースの観点から見ると、 画像ファイルを使用してテクスチャをレンダリングしています。 まずは圧縮画像 永続ストレージからフェッチされます。 画像はホスト メモリ (GPU メモリ) に解凍され、 そしてデバイスのメモリ (RAM) に転送されます。

言い換えれば、画像 I/O は高価になる可能性があります。 キャッシュは複雑な階層のスナップショットを提供します。 後続のフレームでレンダリングするのが簡単になります。ラスター キャッシュ エントリにはコストがかかるため、 GPU メモリを構築して負荷を消費し、 絶対に必要な場合にのみイメージをキャッシュします。

を有効にすると、どの画像がキャッシュされているかを確認できます。PerformanceOverlayLayer.checkerboardRasterCacheImagesスイッチ。

アプリを実行し、ランダムな色でレンダリングされた画像を探します。 チェッカーボードは、画像がキャッシュされていることを示します。 シーンを操作すると、市松模様の画像が表示されます。 一定のままにする必要があります。ちらつきは見たくないのですが、 これは、キャッシュされた画像が再キャッシュされていることを示します。

ほとんどの場合、静止画像上にチェッカーボードを表示したいとします。 ただし、非静的画像ではそうではありません。静止画像がキャッシュされていない場合は、 に置くことでキャッシュできますRepaintBoundaryウィジェット。エンジンはまだ再塗装を無視するかもしれないが 画像が十分複雑でないと判断した場合は、境界を設定します。

ウィジェット再構築プロファイラーの表示

Flutter フレームワークは、作成が困難になるように設計されています。 60fps ではなくスムーズなアプリケーション。ジャンクがある場合、多くの場合、 単純なバグが原因で、UI の多くが機能しなくなるためです。 必要以上に各フレームを再構築しました。ウィジェット再構築プロファイラー この種のパフォーマンス上の問題をデバッグおよび修正するのに役立ちます バグの。

現在の画面のウィジェットの再構築数を表示できます。 Android Studio および IntelliJ 用の Flutter プラグインのフレーム。 これを行う方法の詳細については、「パフォーマンスデータを表示する

ベンチマーク

次のように記述することで、アプリのパフォーマンスを測定および追跡できます。 ベンチマークテスト。 Flutter Driver ライブラリはサポートを提供します ベンチマーク用。この統合テストフレームワークを使用すると、 以下を追跡するためのメトリクスを生成できます。

  • ジャンク
  • ダウンロードサイズ
  • バッテリー効率
  • 起動時間

これらのベンチマークを追跡すると、次の時点で通知を受けることができます。 パフォーマンスに悪影響を与える回帰が導入されます。

詳細については、を参照してください。結合テスト、 のセクションFlutter アプリのテスト

その他のリソース

次のリソースには、使用方法の詳細が記載されています。 Flutter のツールと Flutter でのデバッグ:

  • デバッグ
  • flutterインスペクター
  • flutter検査官の話、DartConf 2018 で発表
  • Flutter が Dart を使用する理由、ハッカーヌーンの記事
  • Flutter が Dart を使用する理由、Flutter チャンネルのビデオ
  • 開発ツール: Dart および Flutter アプリ用のパフォーマンス ツール
  • flutter APIドキュメント、特にPerformanceOverlayクラス、 そしてそのダーツ:開発者パッケージ